// 导入数据库操作模块
const db = require('../db/index')

// 导入bcryptjs对密码进行加密
const bcrypt = require('bcryptjs')

// 导入生成Token的包
const jwt = require('jsonwebtoken')

// 导入全局的配置文件
const config = require('../config')





// 暴露用户注册的处理函数
exports.regUser = (req,res)=>{
  // 获取客户端提交到服务器的用户信息
  const userinfo = req.body
  // console.log(userinfo);
  // 对表单中的数据进行合法性校验
  // if(!userinfo.username || !userinfo.password){
  //  return res.send({status:1,message:'用户名或者密码不合法'})
  // }

  // 定义SQL语句,查询用户名是否被占用
  const sqlStr = 'select * from ev_users where username=?'
  db.query(sqlStr,userinfo.username,(err,results)=>{
    // 执行SQL语句失败
    if(err){
      // return res.send({status:1,message:err.message})
      return res.cc(err)
    }
    // 判断用户名是否被占用
    if(results.length>0){
      // return res.send({status:1,message:'用户名被占用，请更换其他用户名！'})
      return res.cc('用户名被占用，请更换其他用户名！')
    }
    // 用户名可以使用
    // 调用bcrypt.hashSync()对密码进行加密
    // console.log(userinfo);
    userinfo.password = bcrypt.hashSync(userinfo.password,10)
    // console.log(userinfo);//返回加密后的密码

    // 定义插入新用户的SQL语句
    const sql = 'insert into ev_users set ?'
    // 调用db.query()执行sql语句
    db.query(sql,{username:userinfo.username,password:userinfo.password},(err,results)=>{
      // 执行SQL语句失败
      // if(err) return res.send({status:1,message:err.message})
      if(err) return res.cc(err)
      
      // 成功，判断影响行数是否为1
      // if(results.affectedRows !== 1) return res.send({status:1,message:'注册用户失败，请稍后再试!'})
      if(results.affectedRows !== 1) return res.cc('注册用户失败，请稍后再试!')
      // 注册成功
      // res.send({status:0, message:'注册成功'})
      res.cc('注册成功!',0)
    })
  })
}





// 暴露用户登录的处理函数
exports.login = (req,res)=>{

  // 接受表单数据
  const userinfo = req.body

  // 定义SQL语句
  const sql = `select * from ev_users where username=?`
  db.query(sql,userinfo.username,(err,results)=>{
    // 执行SQL语句失败
    if(err) return res.cc(err)

    // 执行SQL语句成功
    if(results.length !== 1) return res.cc('登入失败!')

    // 判断用户输入的密码是否和数据库中的密码一样
    // res.send('login ok')
    const compareResult = bcrypt.compareSync(userinfo.password,results[0].password)

    // 对比出来的结果为false是证明两次密码不正确
    if(!compareResult) return res.cc('登入失败!')

    // 登录成功 ，生成Token字符串
    // res.send('ok')
    // 通过ES6的高级语法，快速剔除密码和头像的值
    const user = {...results[0],password:'',user_pic:''}
    // console.log(user);

    // 对用户的信息进行加密，生成Token字符串
    const tokenStr = jwt.sign(user,config.jwtSecretKey,{expiresIn:config.expiresIn})

    // console.log(tokenStr);
    // 调用res.send()将Token响应给客户端
    res.send({
      status:0,
      message:'登入成功!',
      token:'Bearer '+ tokenStr
    })

  })

  
}